package middleware

import (
	"fmt"
	"service/modules"
	"service/utils"

	"github.com/asaskevich/govalidator"
	"github.com/gin-gonic/gin"
)

// UserRegisterVerifyMiddleware 用户注册验证
func UserRegisterVerifyMiddleware(ctx *gin.Context) {
	user := new(modules.Users)
	ctx.ShouldBind(user)
	_, err := govalidator.ValidateStruct(user)
	if err != nil {
		utils.HandleFailResponse(ctx, "请按照格式输入", err.Error())
		return
	}
	ip := ctx.ClientIP()
	if ip == "::1" {
		ip = "127.0.0.1"
	}
	user.LoginIp = ip
	//https://6.xn--9kq340kxma.com/api/v1/client/subscribe?token=77c31d4520fc7c4cb84e49465ab14ae2
	// 根据名字查找用户
	_, err = modules.FindUserByNameService(user.UserName)
	if err == nil {
		utils.HandleFailResponse(ctx, "用户已存在! 请联系管理员处理~", nil)
		return
	}
	// 根据手机号码查找用户
	_, err = modules.FindUserByPhoneService(user.Phone)
	if err == nil {
		utils.HandleFailResponse(ctx, "手机号码已存在! 请联系管理员处理~", nil)
		return

	}
	// 根据电子邮箱查找用户
	_, err = modules.FindUserByEmailService(user.Email)
	if err == nil {
		utils.HandleFailResponse(ctx, "邮箱已存在! 请联系管理员处理~", nil)
		return

	}
	// 密码 加密
	if user.Password == "" {
		user.Password = "123456"
	}
	hashPwd, err := utils.HandlePwdEncryptionMd5(user.Password)
	if err != nil {
		utils.HandleFailResponse(ctx, "后台故障!请联系管理处理~", nil)
	}
	fmt.Println(": ", hashPwd)
	user.Password = hashPwd
	user.Rid = 4
	ctx.Set("user", user)
	ctx.Next()
}

// UserLoginVerifyMiddleware 用户登录返回 token
func UserLoginVerifyMiddleware(ctx *gin.Context) {
	user := new(modules.Users)
	ctx.ShouldBind(user)
	if user.Password == "" || user.UserName == "" {
		utils.HandleFailResponse(ctx, "帐号或密码不能为空~", nil)
		return
	}
	// 根据用户名查看完整数据
	u, err := modules.FindUserByNameService(user.UserName)
	if err != nil {
		utils.HandleFailResponse(ctx, "用户不存在~", nil)
		return
	}
	if !u.Status {
		utils.HandleFailResponse(ctx, "系统不允许登录请联系管理员~", nil)
		return
	}
	// 检测密码
	err = utils.HandlePwdParseMd5(u.Password, user.Password)
	if err != nil {
		utils.HandleFailResponse(ctx, "密码错误~", nil)
		return
	}
	ctx.Set("user", u)
	ctx.Next()
}

// AuthVerifyMiddleware 登录操作验证
func AuthVerifyMiddleware(ctx *gin.Context) {
	authorization := ctx.GetHeader("Authorization")
	// 验证token
	token, claims, err := utils.ParseToken(authorization)
	if err != nil || !token.Valid {
		utils.HandleFailResponse(ctx, "无效token", nil)
		return
	}

	user, err := modules.FindUserByNameService(claims.UserName)
	if err != nil {
		utils.HandleFailResponse(ctx, "用户不存在", nil)
		return
	}
	if user.EditAccount {
		utils.HandleFailResponse(ctx, "请重新登录", nil)
		return
	}
	// 1 GET
	// 2 GET POST
	// 3 GET POST PATCH
	// 4 GET POST PATCH DELETE
	if ctx.Request.Method == "GET" {
		ctx.Set("user", user)
		ctx.Next()
	}
	switch ctx.Request.Method {
	case "POST":
		if user.Rid < 2 {
			utils.HandleFailResponse(ctx, "添加权限不足! 请联系管理员修改权限", nil)
			return
		}
	case "PATCH":
		if user.Rid < 3 {
			utils.HandleFailResponse(ctx, "修改权限不足! 请联系管理员修改权限", nil)
			return
		}
	case "DELETE":
		if user.Rid < 4 {
			utils.HandleFailResponse(ctx, "删除权限不足! 请联系管理员修改权限", nil)
			return
		}
	}
	ctx.Set("user", user)
	ctx.Next()
}
